以前读过一些 JDK 常用的源码。当时的做法是在 IDE 打开源码文件,同时打开官方文档和谷歌翻译,一边读一边翻译,那时觉得还颇有收获。但是,由于基础薄弱,为了加快速度,有很多不理解的地方跳过了。
AbstractMap是Map接口的抽象实现类,通过抽象方法keySet()实现了get(key),remove(key),containsKey(key),containsValue(value)的基本算法,遍历加equals。
常用方法 await阻塞当前线程源码 public void await() throws InterruptedException { sync.acquireSharedInterruptibly 这个区别,就是 await(long timeout, TimeUnit unit) 多了一个超时判断步骤,所在源码如下: public final boolean tryAcquireSharedNanos 取消申请 countDown:倒计时源码 public void countDown() { sync.releaseShared(1); } public return false; } 代码分析: 【1】回调CountDownLatch#Sync的tryReleaseShared方法,返回倒计时是否等于0的判断 【2】如果倒计时到0了,则进行释放倒计时 源码分析
概述 ThreadPoolExecutor 是 JDK 中线程池的实现类,它的继承结构如下: ? maximumPoolSize: 最大池大小,线程池中能同时存在的最大线程数,大于等于 corePoolSize; workQueue: 工作/任务队列,是一个阻塞队列,可参考前文「JDK 源码分析-BlockingQueue」的分析。 runWorker(this); } // 其他一些 AQS 相关的方法不再一一列举} 可以看到 Worker 类继承自 AQS,它的实现与 ReentrantLock 有一些类似,可对比前文「JDK 源码分析-ReentrantLock」分析。
概述 前文「JDK源码分析-PriorityQueue」分析了优先队列 PriorityQueue,它既不是阻塞队列,而且线程不安全。 juejin.im/post/5cc258796fb9a03228616e6e https://blog.csdn.net/codejas/article/details/89190774 相关阅读: JDK 源码分析-PriorityQueue JDK源码分析-ReentrantLock Stay hungry, stay foolish.
super E>): 从该集合中移除满足指定条件的元素,其中 Predicate 是 JDK 1.8 引入的函数式操作,即传入的参数是一个方法; 12. retainAll(Collection<? 16. spliterator(): 可分割迭代器,用于并行遍历集合中的元素(iterator() 方法是顺序遍历); 17. stream() & parallelStream(): JDK 1.8 super T>) 方法,该方法也是 JDK 1.8 引入的,提供遍历集合元素的函数式操作。 PS: JDK 版本如下: ? 阅读源码时,个人以为应该先读接口类,而非具体的实现类。原因有二: 1. 实现类的代码一般较多,如果初读源码就钻到实现类,可能容易被搞蒙。 Stay hungry, stay foolish
概述 前文「JDK源码分析-ArrayBlockingQueue」分析了 ArrayBlockingQueue 的代码实现,LinkedBlockingQueue 也是阻塞队列的实现。
中所有 Entry 的 Set 视图 // 其中 Entry 是 Map 内部的一个接口,可以理解为 Map 的“元数据” Set<Map.Entry<K, V>> entrySet(); 此外,JDK 其中前面几个方法都比较简单,这里分析下后面几个 JDK 1.8 引入的方法,如下: // 返回一个比较器,它以自然顺序比较 Entry 的 key public static <K extends Comparable
JDK源码阅读指南 Read The Fucking Source Code ---- RTFM源码面前,了无秘密 ---- 侯捷 背景 今天逛GitHub,发现了一个神级项目,作者将主要整理 /记录阅读JDK源码时的理解与体会分享出来,便于大家学习。 项目食用指南 项目中包含多个分支,主分支命名为master,测试分支命名为test,源码/笔记分支以JDK-X(X是JDK版本)命名。 master分支不定期汇总源码笔记与测试代码的快照。 JDK-X分支存放JDK的源码与笔记。阅读过程中产生的笔记以注释的形式直接写在源码文件中。 test分支存放辅助理解的测试代码,可直接运行。 阅读源码时请切换到JDK-X分支,且不需要关联JDK。 测试源码时请切换到test分支,此时需要关联OracleJDK/OpenJDK。
Collection Collection接口是java最基础,重要的接口之一,它有List,Set,Queue等Java最常用的子接口,这里主要解析Collection这个接口以及它最常用的类的源码实现 true); } } stream()和splitIterator()方法在Collection接口中是有默认实现的,这是java8的新语法,即接口方法也可以有默认实现,查看stream()源码可知 default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); } 在看Collection子类源码的时候
2、源码分析2.1类定义public class LinkedList<E> extends AbstractSequentialList<E> implements List<E> */transient Node<E> last;/** 修改次数 */protected transient int modCount = 0;源码分析:LinkedList 内置了两个指针,包括头结点 字段用于跟踪列表的结构修改次数,以确保在迭代过程中发生并发修改时能够快速失败,会直接触发异常ConcurrentModificationException2.3 基本操作:增删改查(1)增加元素通过阅读源码 addAll的两个重载方法:则是批量插入元素解析 add(E e) 方法源码public boolean add(E e) { linkLast(e); return true;}void :linkLast(e):尾插法新建Node节点:前继指针指向last,当前数据为e,后继指针为null容量size+1,修改次数+1(2)删除元素解析remove()方法源码源码分析:public E
结点类 Node 查看 LinkedList 的源码可发现它内部有个嵌套类 Node,代码如下: private static class Node<E> { E item; // 存储的数据 相关阅读: JDK源码-Queue, Deque Stay hungry, stay foolish.
; } 其中,acquireSharedInterruptibly、tryAcquireSharedNanos 和 releaseShared 都是 AQS 中「共享模式」的方法,具体代码可参考前文「JDK 源码分析-AbstractQueuedSynchronizer(3)」的分析。 相关阅读: JDK源码分析-AbstractQueuedSynchronizer(3) Stay hungry, stay foolish.
CyclicBarrier 是并发包中的一个工具类,它的典型应用场景为:几个线程执行完任务后,执行另一个线程(回调函数,可选),然后继续下一轮,如此往复。
具体可参考前文对 AQS 共享模式的分析「JDK源码分析-AbstractQueuedSynchronizer(3)」。 相关阅读: JDK源码分析-AbstractQueuedSynchronizer(3) Stay hungry, stay foolish.
概述 前文「JDK源码分析-HashMap(1)」分析了 HashMap 主要方法的实现原理(其他问题以后分析),本文分析下 LinkedHashMap。
相关阅读: JDK源码分析-HashMap(1) Stay hungry, stay foolish.
说明 对于JDK源码分析的文章,仅仅记录我认为重要的地方。源码的细节实在太多,不可能面面俱到地写清每个逻辑。 所以我的JDK源码分析,着重在JDK的体系架构层面,具体源码可以参考:http://www.cnblogs.com/skywang12345/category/455711.html。
概述 在 JDK 1.5 以前,锁的实现只能用 synchronized 关键字;1.5 开始提供了 ReentrantLock,它是 API 层面的锁。 非公平锁的 lock 操作为:先尝试以 CAS 方式修改 state 的值,若修改成功,则表示成功获取到锁,将 owner 设为当前线程;否则就执行 AQS 中的 acquire 方法,具体可参考前文「JDK 源码分析-AbstractQueuedSynchronizer(2)」,这里不再赘述。 JDK 1.6 以后,synchronized 与 ReentrantLock 性能基本持平,JVM 未来的性能优化也会更偏向于原生的 synchronized。 相关阅读: JDK源码分析-Lock&Condition JDK源码分析-AbstractQueuedSynchronizer(2) Stay hungry, stay foolish.
DelayQueue 也是一种队列,它内部的元素有“延迟”,也就是当从队列中获取元素时,如果它的延迟时间未到,则无法取出。